package demo.engine.template;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

public class MarkdownCodeBlockParser {

    // 匹配起始符行的正则：以```开头，后面可跟语言标识（可选），行尾无其他字符
    private static final Pattern START_PATTERN = Pattern.compile("^```\\s*([a-zA-Z0-9]*?)\\s*$");
    // 结束符行的标识（trim后必须为```）
    private static final String END_MARKER = "```";

    /**
     * 解析Markdown文本中的第一个代码块
     * @param markdown 原始Markdown文本
     * @return 代码块信息（语言标识+内容），无代码块则返回null
     */
    public static CodeBlock parseFirstCodeBlock(String markdown) {
        if (markdown == null || markdown.isEmpty()) {
            return null;
        }

        // 按行分割（兼容Windows和Linux换行符）
        String[] lines = markdown.split("\\r?\\n");
        int startLineIndex = -1;
        String language = "";

        // 第一步：寻找起始符行
        for (int i = 0; i < lines.length; i++) {
            String line = lines[i].trim(); // 先trim，处理前后空格
            if (START_PATTERN.matcher(lines[i]).matches()) { // 用原始行匹配（避免trim掉语言标识前的空格）
                startLineIndex = i;
                // 提取语言标识（如```json → 提取json）
                String[] parts = lines[i].split("\\s+", 2); // 按空格分割，最多分2部分
                if (parts.length > 1) {
                    language = parts[1].trim();
                }
                break;
            }
        }

        // 未找到起始符，返回null
        if (startLineIndex == -1) {
            return null;
        }

        // 第二步：寻找结束符行，收集内容行
        List<String> contentLines = new ArrayList<>();
        int endLineIndex = -1;
        for (int i = startLineIndex + 1; i < lines.length; i++) {
            String line = lines[i].trim();
            // 结束符行必须trim后为```
            if (END_MARKER.equals(line)) {
                endLineIndex = i;
                break;
            }
            // 未找到结束符，当前行作为内容行
            contentLines.add(lines[i]);
        }

        // 未找到结束符（代码块不完整），返回null
        if (endLineIndex == -1) {
            return null;
        }

        // 拼接内容行（保留原始换行）
        String content = String.join("\n", contentLines);
        return new CodeBlock(language, content);
    }

    // 代码块信息封装类
    public static class CodeBlock {
        private final String language; // 语言标识（如json、yaml）
        private final String content;  // 代码块内容

        public CodeBlock(String language, String content) {
            this.language = language;
            this.content = content;
        }

        // getter方法
        public String getLanguage() { return language; }
        public String getContent() { return content; }
    }

    // 测试示例
    public static void main(String[] args) {
        // 测试用例1：标准代码块，结束符后有换行
        String md1 = "这是文本\n```json\n{\"name\":\"test\"}\n```\n这是后续文本";
        CodeBlock cb1 = parseFirstCodeBlock(md1);
        System.out.println("语言：" + cb1.getLanguage() + "，内容：" + cb1.getContent()); // 语言：json，内容：{"name":"test"}

        // 测试用例2：结束符后有空格（结束符行本身无空格）
        String md2 = "```yaml\nname: test\n```   \n后续内容"; // 结束符行是```，后面有空格和换行
        CodeBlock cb2 = parseFirstCodeBlock(md2);
        System.out.println("语言：" + cb2.getLanguage() + "，内容：" + cb2.getContent()); // 语言：yaml，内容：name: test

        // 测试用例3：结束符行有前导空格（合法）
        String md3 = "```text\n普通文本\n  ```\n"; // 结束符行是"  ```"（trim后为```）
        CodeBlock cb3 = parseFirstCodeBlock(md3);
        System.out.println("语言：" + cb3.getLanguage() + "，内容：" + cb3.getContent()); // 语言：text，内容：普通文本

        // 测试用例4：不完整代码块（无结束符）
        String md4 = "```json\n{\"id\":1}";
        CodeBlock cb4 = parseFirstCodeBlock(md4);
        System.out.println(cb4); // null
    }
}
